package com.wosai.medical.hospital.demo.controller.basic;

import com.wosai.medical.hospital.demo.common.PayFeeException;
import com.wosai.medical.hospital.demo.controller.BaseController;
import com.wosai.medical.hospital.demo.controller.basic.response.HospitalInfo;
import com.wosai.medical.hospital.demo.controller.basic.response.PatientInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.function.ServerRequest;

import java.io.Serializable;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 医院信息
 *
 * @author yangyong
 * @version 1.0
 * @date 2019/11/22 6:10 下午
 **/
@Slf4j
@Api(tags = "基础信息")
@RestController
@RequestMapping("/hospital")
public class HospitalController extends BaseController {

    /**
     *
     * 1.1. 医院信息
     *
     * @param apiAppId   接入账号
     * @param apiVersion 接口版本号
     * @param apiStamp   时间戳
     * @param apiSign    参数签名
     * @return 获取医院信息
     */
    @GetMapping("/info")
    @ApiOperation("1.1.医院信息")
    public RespResult<HospitalInfo> getHospitalInfo(
            //接入账号(app_id)
            @RequestHeader("api_app_id") final String apiAppId,
            //接口版本号(采用正整数描述)
            @RequestHeader("api_version") final Integer apiVersion,
            //时间戳(13位到毫秒)
            @RequestHeader("api_stamp") final Long apiStamp,
            //参数签名
            @RequestHeader("api_sign") final String apiSign
    ) {

        return action(new Process<HospitalInfo>() {
            @Override
            public String getAppId() {
                return apiAppId;
            }
            

            @Override
            public Integer getVersion() {
                return apiVersion;
            }

            @Override
            public Long getStamp() {
                return apiStamp;
            }

            @Override
            public String getSign() {
                return apiSign;
            }

            @Override
            public HospitalInfo handler() {

                if (1==1) {
                    throw new PayFeeException("缴费失败，需要退费");
                }
                ///TODO: 业务处理
                return HospitalInfo.builder()
                        //医院名称
                        .name("全流程医院--"+getAppId())
                        //医院类别
                        .category(1)
                        //医院等级
                        .level(31)
                        //医院简介
                        .intro("全流程医院,医院的接入账号是:"+getAppId())
                        //医院地址
                        .address("医院地址")
                        //医院电话
                        .tel("13800000001")
                        .build();
            }
        });
    }

    /**
     * 1.2. 患者信息
     *
     * @param apiAppId   接入账号
     * @param apiVersion 接口版本号
     * @param apiStamp   时间戳
     * @param apiSign    参数签名
     * @param cardType   就诊卡类型(11-身份证,21-健康卡,31-诊疗卡)
     * @param cardNo     就诊卡号码
     * @return 获取患者信息
     */
    @ApiOperation("1.2.患者信息")
    @GetMapping("/patient/{cardType}/{cardNo}")
    public RespResult<PatientInfo> getPatientInfo(
            //接入账号(app_id)
            @RequestHeader("api_app_id") final String apiAppId,
            //接口版本号(采用正整数描述)
            @RequestHeader("api_version") final Integer apiVersion,
            //时间戳(13位到毫秒)
            @RequestHeader("api_stamp") final Long apiStamp,
            //参数签名
            @RequestHeader("api_sign") final String apiSign,
            //就诊卡类型(11-身份证,21-健康卡,31-诊疗卡)
            @PathVariable final Integer cardType,
            //就诊卡号码
            @PathVariable final String cardNo,
            //姓名
            @PathVariable final String name,
            //电话号码
            @PathVariable final String tel

            ) {
        return action(new Process<PatientInfo>() {
            @Override
            public String getAppId() {
                return apiAppId;
            }

            @Override
            public Integer getVersion() {
                return apiVersion;
            }

            @Override
            public Long getStamp() {
                return apiStamp;
            }

            @Override
            public String getSign() {
                return apiSign;
            }

            @Override
            public Map<String, Serializable> getParams() {
                return new HashMap<String, Serializable>(2){
                    {
                        //就诊卡类型(11-身份证,21-健康卡,31-诊疗卡)
                        put("cardType", cardType);
                        //就诊卡号码
                        put("cardNo", cardNo);
                        put("name", name);
                        put("tel", tel);
                    }
                };
            }

            @Override
            public PatientInfo handler() {
                final Calendar calendar = Calendar.getInstance();
                calendar.set(1980, Calendar.JULY,10);


                ///TODO: 业务处理
                return PatientInfo.builder()
                        //患者代码(HIS患者唯一标识)
                        .code(cardNo)
                        //患者姓名
                        .name("测试患者")
                        //性别(0:未知,1:男,2:女)
                        .gender(1)
                        //出生日期(yyyy-MM-dd)
                        .birthday(calendar.getTime())
                        //联系电话(可空, 须脱敏)
                        .phone("139****0001")
                        //身份证件类型(0: 未实名验证,1: 身份证)
                        .idType(1)
                        //证件号码(可空, 须脱敏)
                        .idNumber("4307***********4012")
                        //就诊卡类型(11-身份证,21-健康卡,31-诊疗卡)
                        .cardType(21)
                        //就诊卡号(多张诊疗卡用半角逗号分隔)
                        .cardNumber(cardNo)
                        .build();
            }
        });
    }
}
